;(function(){
	
	// fso不存在 rename()，只有通过 move() 来完成。
	function renName(){}
	
})();

/** 
 * 打开文件，读取其内容，返回文本的格式。
 * @static
 * @param	{String}	path		文件路径
 * @param	{Boolean}	isMapPath	是否送入相对路径。True 的话把虚拟路径还原为真实的磁盘路径。
 * @return	{String} 				文本内容
 */
$$.fs.File.read = function(path){
	with(new ActiveXObject("Adodb.Stream")){
        type = 2;
        mode = 3;
        charset = "utf-8";
        try {
            open();
            loadFromFile(path);
            return readText();
        }catch (e){
            throw e;
        }finally{
            close();
        }
    }
}

/**
 * 将数据保存到磁盘上。可支持文本数据和二进制数据。
 * @param 	{String} 	data 		要写入的数据，可以是二进制对象。
 * @param 	{String} 	path 		文件路径。
 * @param 	{Boolean} 	isBinary	是否为二进制数据。
 * @param 	{Boolean} 	isMapPath	是否送入相对路径。True 的话把虚拟路径还原为真实的磁盘路径。
 * @return 	{Boolean} 	True		表示操作成功。
 */
$$.fs.File.write = function(data, path, isBinary, chartset){
    with(new ActiveXObject("Adodb.Stream")){
        type = isBinary ? 1 : 2;
        if (!chartset && !isBinary)
			charset = "utf-8";
        if (chartset)
			charset = "GB2312";
        try {
			open();
			if(!isBinary){
				writeText(data);
			}else{
				write(data);
			} 
			saveToFile(path, 2);
			return true;
        }catch(e){
			throw e;
        } finally {
			close();
        }
    }
    
    return true;
}


﻿$$.disk = {

//function folderHelper(path, onfile_Fn, onfolder_Fn) {
//	var fso = new ActiveXObject("Scripting.FileSystemObject");
//		
//	if (fso.FolderExists(path)){
//		search(fso.GetFolder(path));
//	}
//	// __Search()
//	function search(folder){
//		for (var e = new Enumerator(folder.SubFolders); !e.atEnd(); e.moveNext()) {
//			var item = e.item();
//			if (typeof onfolder_Fn === "function")
//				onfolder_Fn(item, fso);
//			if (recursive){
//				arguments.callee(item);
//			}
//		}
//		for (var e = new Enumerator(folder.Files); !e.atEnd(); e.moveNext()) {
//			if (typeof onfile_Fn === "function"){
//				onfile_Fn(e.item(), fso);
//			}
//		}
//	}
//}	
	/**
	 * @param {String} folder
	 * @param {Function} fn
	 */
	getFlatFlies : function(folder, isRecursive, fn, scope){
	    var  
	         fso    = new ActiveXObject("Scripting.FileSystemObject")
	        ,target = fso.getFolder(folder);	
	        
	    if(!fn || typeof(fn) != 'function'){
	    	throw "该函数期待一个合法函数的参数！";
	    }
	    
	    function getFiles(folderObj){
	        var fileObj, i = 0;
	        with(new Enumerator(folderObj.Files /* 列出所有文件 */)){
	            while (!atEnd()){
	                fileObj = item();
//	                if(fileObj.Name.split('.').pop().indexOf('js') != -1){
//	                    arr.push(fileObj.Path);
//	                }
	                fn.call(scope, fileObj, folderObj, i++);
	                fileObj = null;
	                moveNext();
	            }		
	        } 
	    }
	    // 本目录下的文件
	    getFiles(target);
	    // 子目录下所有的文件
	    if(isRecursive){
		    ;(function(items){
		        var folderObj;
		        with(new Enumerator(items)){
		            while (!atEnd()){
		                folderObj = item();
		                getFiles(folderObj);
		                
		                if(folderObj.subFolders.Count > 0){
		                    arguments.callee(folderObj.subFolders); //　递归
		                }
		                folderObj = null;
		                moveNext();
		            }		
		        }      
		    })(target.SubFolders);  
	    }
	    
	    return true;
	}
    
	,base64EncodeText: function (TextStr) {
		var xml_dom = new ActiveXObject("MSXML2.DOMDocument");
		var ado_stream = new ActiveXObject("ADODB.Stream");
		var tmpNode = xml_dom.createElement("tmpNode");
		
		tmpNode.dataType = "bin.base64";
		ado_stream.Charset = "gb2312";
		ado_stream.Type = 2;// 1=adTypeBinary 2=adTypeText
		if (ado_stream.state == 0) {// 0=adStateClosed 1=adStateOpen
			ado_stream.Open();
		}
		ado_stream.WriteText(TextStr);
		ado_stream.Position = 0;
		ado_stream.Type = 1;// 1=adTypeBinary 2=adTypeText
		tmpNode.nodeTypedValue = ado_stream.Read(-1);// -1=adReadAll
		ado_stream.Close();
		return tmpNode.text;
	}    
	
};

/**
 * 自动适应编码类型http://www.codeproject.com/KB/scripting/Exsead7.aspx
 * @param {String} filename
 * @return {String}
 */ 
$$.disk.toString = function(filename, sCharset) {
	var fileContent, stream = new ActiveXObject('adodb.stream');

	with(stream){
		type = 2;// 1－二进制，2－文本
		mode = 3;// 1－读，2－写，3－读写
		open();
	
		if (!sCharset) {
			try{
				stream.charset = "437"; // why try, cause some bug now
			}catch(e){}
			loadFromFile(filename);
			
			// get the BOM(byte order mark) or escape(ReadText(2)) is fine?
			switch (escape(readText(2).replace(/\s/g, ''))) {
				case "%3Ca" :
				case "%3Cd" :
				case "%3C%3F" :
				case "%u2229%u2557" :	// 0xEF,0xBB => UTF-8
					sCharset = "UTF-8";
					break;
				case "%A0%u25A0" :		// 0xFF,0xFE => Unicode
				case "%u25A0%A0" :		// 0xFE,0xFF => Unicode big endian
					sCharset = "Unicode";
					break;
				default :
					// 判断不出来就使用GBK，这样可以在大多数情况下正确处理中文
					sCharset = "GBK";	
//					close();
					// 用使用“系统默认编码”
					// { Read: 1, Write: 2, Append: 8 }
//					with(new ActiveXObject("Scripting.FileSystemObject").openTextFile(filename, 1)){
//						fileContent = readAll();
//						close();
//					}
//					fileContent = new String(fileContent);
//					fileContent.charset = 'SystemDefault';
//					return fileContent;
					break;
			}
			close();
			open();
		}
		charset = sCharset;
		loadFromFile(filename);
		fileContent = new String(readText());
		fileContent.charset = sCharset;
		close();
	}
	return fileContent;
}

